use std::cell::RefCell;
/**
    Arc指针
       能与Rc相互转换  rc-weak Rc::upgrade  weak-rc Rc::downgrade
       使用Rc::weak_count 查看引用计数
       用途：
            弱指针
            对数据的非拥有引用 非拥有所有权 并不代表拿不到所有权 升级为Rc就能拿到所有权
            主要是配合rc解决循环引用问题
            用于观察或临时访问数据，避免循环引用和内存泄漏
            需要打破循环引用（例如树形结构中父节点和子节点互相引用）
 */
use std::rc::{Rc, Weak};
#[derive(Debug)]
struct User {
    name: RefCell<String>,
    parent: RefCell<Weak<User>>,
    children: RefCell<Vec<Rc<User>>>
}
impl User {
    fn new(name: String) -> Self {
        Self {
            name: RefCell::new(name),
            parent: RefCell::new(Weak::new()),
            children: RefCell::new(vec![])
        }
    }
}
fn main() {
    let tom = Rc::new(User::new("tom".to_string()));

    let tom_parent = Rc::new(User::new("tom-parent".to_string()));

    tom_parent.children.borrow_mut().push(Rc::clone(&tom));
    // Rc::downgrade(&tom_parent) Rc->Weak 降级 并赋值给tom.parent
    *tom.parent.borrow_mut() = Rc::downgrade(&tom_parent);
    println!("tom-parent:{:?}",tom_parent);
    // tom.parent.borrow().upgrade() Weak->Rc 升级 如果不升级看到的就一直是Weak 就是因为这里造成了循环引用 tom-p -> tomP , tomP-c -> tom
    //通过 weak.upgrade() 获取 Option<Rc<T>>，如果数据已被释放，返回 None
    println!("tom:{:?}",tom.parent.borrow().upgrade());

    println!("tom-p_count:{}",Rc::strong_count(&tom)  )
}
